import { BrowserWindow } from 'electron'

// 使用 Map 管理多窗口实例，键为窗口名称，值为窗口实例
const windows = new Map<string, BrowserWindow>()

export default {
  /**
   * 创建或获取一个窗口
   * @param name - 窗口名称，用于标识窗口
   * @param options - Electron BrowserWindow 配置选项
   * @returns 返回创建或已存在的窗口实例
   */
  createWindow(name: string, options: Electron.BrowserWindowConstructorOptions): BrowserWindow {
    if (windows.has(name)) {
      return windows.get(name)! // 如果窗口已存在，直接返回
    }

    // 创建新的窗口
    const win = new BrowserWindow({
      width: 800,
      height: 600,
      ...options
    })

    ;(win as any).name = name // 给窗口添加自定义名称

    // 当窗口关闭时从 Map 中移除
    win.on('closed', () => {
      windows.delete(name)
    })

    windows.set(name, win) // 将新窗口加入 Map 管理
    return win
  },

  /**
   * 获取指定名称的窗口
   * @param name - 窗口名称
   * @returns 返回窗口实例或 undefined
   */
  getWindow(name: string) {
    return windows.get(name)
  },

  /**
   * 获取所有窗口的基本信息
   * @returns 返回包含窗口名称和 ID 的数组
   */
  getAllWindows() {
    const list: { name: string; id: number }[] = []
    for (const [name, win] of windows.entries()) {
      if (!win.isDestroyed()) {
        list.push({ name, id: win.id })
      }
    }
    return list
  },

  /**
   * 检查指定名称的窗口是否存在
   * @param name - 窗口名称
   * @returns 是否存在
   */
  hasWindow(name: string) {
    return windows.has(name)
  },

  /**
   * 使指定名称的窗口获得焦点
   * @param name - 窗口名称
   * @returns 操作是否成功
   */
  focusWindow(name: string) {
    const win = windows.get(name)
    if (win && !win.isDestroyed()) {
      win.focus()
      return true
    }
    return false
  },

  /**
   * 关闭指定名称的窗口
   * @param name - 窗口名称
   * @returns 操作是否成功
   */
  closeWindow(name: string) {
    const win = windows.get(name)
    if (win && !win.isDestroyed()) {
      win.close()
      return true
    }
    return false
  },

  /**
   * 向指定窗口发送消息
   * @param name - 窗口名称
   * @param channel - 通信通道
   * @param payload - 消息内容
   * @returns 操作是否成功
   */
  sendMessageToWindow(name: string, channel: string, payload: any) {
    const win = windows.get(name)
    if (win && win.webContents && !win.isDestroyed()) {
      win.webContents.send(channel, payload)
      return true
    }
    return false
  }
}
